#include <gtk/gtk.h>
#include <locale.h>

static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) {
    if (event->keyval == GDK_KEY_q || event->keyval == GDK_KEY_Q) {
        gtk_main_quit();
        return TRUE;
    }
    return FALSE;
}

int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    if (!setlocale(LC_ALL, "")) {
        printf("Ошибка установки локали\n");
        return 1;
    }

    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "acpi - Desktop Version");
    gtk_window_set_default_size(GTK_WINDOW(window), 670, 715);
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG);

    // Контейнер и фон
    GtkWidget *overlay = gtk_overlay_new();
    gtk_container_add(GTK_CONTAINER(window), overlay);

    GtkWidget *background = gtk_image_new_from_file("grnWatch.jpg");
    gtk_overlay_add_overlay(GTK_OVERLAY(overlay), background);
    gtk_widget_set_halign(background, GTK_ALIGN_FILL);
    gtk_widget_set_valign(background, GTK_ALIGN_FILL);

    // Виджет прокрутки и текстовое поле
    GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_widget_set_size_request(scrolled_window, 630, 680); // ширина и высота
    gtk_widget_set_halign(scrolled_window, GTK_ALIGN_CENTER);
    gtk_widget_set_valign(scrolled_window, GTK_ALIGN_CENTER);
    gtk_overlay_add_overlay(GTK_OVERLAY(overlay), scrolled_window);

    GtkWidget *text_view = gtk_text_view_new();
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text_view), GTK_WRAP_WORD_CHAR);
    gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE);
    gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);

    // Вставка текста
    GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
    const gchar *poem =
        "\n"
        " *** Сравнительное техническое описание трёх реализаций аналоговых часов ***\n"
        "\n"
        " Ниже представлено сравнение трёх скриптов, реализующих аналоговые часы\n"
        " с уникальным дизайном циферблата, написанных на разных языках программирования:\n"
        " C (с использованием GTK),\n"
        " Python (с использованием Tkinter)\n"
        " и JavaScript (с использованием HTML5 Canvas).\n"
        " Каждый скрипт создаёт графический интерфейс с часами,\n"
        " отображающими текущее время, и использует фоновое изображение `grnWatch`\n"
        " для стилизации.\n"
        "\n"
        " * Общее описание *\n"
        "\n"
        " Все три скрипта реализуют аналоговые часы с:\n"
        " - Часовой, минутной и секундной стрелками.\n"
        " - Уникальными символами вместо традиционных цифр\n"
        " (линии, звёзды, многоугольники и т.д.) для обозначения часов.\n"
        " - Фоновым изображением (`grnWatch.jpg`, `grnWatch.gif`, `grnWatch.png`\n"
        " соответственно).\n"
        " - Обновлением времени в реальном времени (каждую секунду).\n"
        "\n"
        " Однако подходы к реализации, используемые библиотеки\n"
        " и детали различаются в зависимости от языка и платформы.\n"
        "\n"
        "+---------------------------+---------------------------------+\n"
        "| * Сравнительная таблица: Основные характеристики *          |\n"
        "+---------------------------+---------------------------------+\n"
        "| Характеристика            | C (GTK)                         |\n"
        "+---------------------------+---------------------------------+\n"
        "| **Язык программирования** | C                               |\n"
        "| **Библиотека/Фреймворк**  | GTK 3.0, Cairo                  |\n"
        "| **Платформа**             | Десктоп (Linux/Windows)         |\n"
        "| **Размер окна/холста**    | 670x716 пикселей                |\n"
        "| **Формат фона**           | JPG (`grnWatch.jpg`)            |\n"
        "| **Обновление времени**    | Каждую секунду (g_timeout_add)  |\n"
        "| **Компиляция/Запуск**     | Требует компиляции (gcc)        |\n"
        "| **Зависимости**           | GTK 3.0, Cairo, libm            |\n"
        "+---------------------------+---------------------------------+\n"
        "\n"
        "+------------------------------+-------------------------------+\n"
        "| Python (Tkinter)             | JavaScript (HTML5 Canvas)     |\n"
        "|------------------------------|-------------------------------|\n"
        "| Python                       | JavaScript                    |\n"
        "| Tkinter                      | HTML5 Canvas                  |\n"
        "| Десктоп (кроссплатформенная) | Веб-браузер                   |\n"
        "| 683x768 пикселей             | 616x616 пикселей              |\n"
        "| GIF (`grnWatch.gif`)         | PNG (`grnWatch.png`)          |\n"
        "| Каждую секунду (root.after)  | Каждую секунду (setInterval)  |\n"
        "| Интерпретируемый (python3)   | Запуск в браузере             |\n"
        "| Tkinter (python3-tk)         | Нет (браузер с поддержкой JS) |\n"
        "+------------------------------+-------------------------------+\n"
        "\n"
        "+---------------------------+-----------------------------------+\n"
        "| * Сравнительная таблица: Элементы дизайна циферблата *        |\n"
        "+------------------------------+--------------------------------+\n"
        "| Элемент                      | C (GTK)                        |\n"
        "+------------------------------+--------------------------------+\n"
        "| **Центр циферблата**         | (341, 384)                     |\n"
        "| **Радиус секундной стрелки** | 194 пикселя                    |\n"
        "| **Круги циферблата**         | 4 круга (253, 195, 174, 166)   |\n"
        "| **Маленькие кружки**         | 60 (радиус 4, расстояние 170)  |\n"
        "| **Большие кружки (часы)**    | 12 (радиус 9, расстояние 185)  |\n"
        "| **Внешние круги**            | 12 (радиус 28, расстояние 225) |\n"
        "| **Цвет линий**               | LightCyan (0.68, 0.93, 0.93)   |\n"
        "+------------------------------+--------------------------------+\n"
        "\n"
        "+--------------------------------+--------------------------------+\n"
        "| Python (Tkinter)               | JavaScript (HTML5 Canvas)      |\n"
        "+--------------------------------+--------------------------------+\n"
        "| (342, 323)                     | (308, 308)                     |\n"
        "| 194 пикселя                    | 208 пикселей                   |\n"
        "| 4 круга (разные радиусы)       | 4 круга (198, 208, 233, 303)   |\n"
        "| 60 (радиус 4, расстояние 170)  | 30 (радиус 5, расстояние 203)  |\n"
        "| 12 (радиус 9, расстояние 185)  | 12 (радиус 13, расстояние 220) |\n"
        "| 12 (радиус 28, расстояние 225) | 12 (радиус 34, расстояние 268) |\n"
        "| LightCyan                      | DarkCyan + Teal (заливка)      |\n"
        "+--------------------------------+--------------------------------+\n"
        "\n"
        "+----------------------------------------------------------------+\n"
        "| * Сравнительная таблица: Символы часов *                       |\n"
        "+-----+-----------------------------+----------------------------+\n"
        "| Час | C (GTK)                     | Python (Tkinter)           |\n"
        "+-----+-----------------------------+----------------------------+\n"
        "| 1   | Вертикальная линия          | Вертикальная линия         |\n"
        "| 2   | Вертикальная линия          | Вертикальная линия         |\n"
        "| 3   | Треугольник                 | Треугольник                |\n"
        "| 4   | Квадрат                     | Квадрат                    |\n"
        "| 5   | Пятиконечная звезда         | Пятиконечная звезда        |\n"
        "| 6   | Два треугольника + линии    | Два треугольника + линии   |\n"
        "| 7   | Семиконечная звезда         | Семиконечная звезда        |\n"
        "| 8   | Два квадрата                | Два квадрата               |\n"
        "| 9   | Три треугольника            | Три треугольника           |\n"
        "| 10  | Две пятиконечные звезды     | Две пятиконечные звезды    |\n"
        "| 11  | Одиннадцатиконечная звезда  | Одиннадцатиконечная звезда |\n"
        "| 12  | Двенадцатиугольник + звезда | Двенадцатиугольник + линии |\n"
        "+-----+-----------------------------+----------------------------+\n"
        "\n"
        "+-----+-----------------------------+\n"
        "| Час | JavaScript (HTML5 Canvas)   |\n"
        "+-----+-----------------------------+\n"
        "| 1   | Вертикальная линия          |\n"
        "| 2   | Вертикальная линия          |\n"
        "| 3   | Треугольник                 |\n"
        "| 4   | Квадрат                     |\n"
        "| 5   | Пятиконечная звезда         |\n"
        "| 6   | Шестиконечная мозаика       |\n"
        "| 7   | Семиконечная звезда         |\n"
        "| 8   | Восьмиконечная звезда       |\n"
        "| 9   | Девятиконечная звезда       |\n"
        "| 10  | Десятиконечная звезда       |\n"
        "| 11  | Одиннадцатиконечная звезда  |\n"
        "| 12  | Двенадцатиугольник + звезда |\n"
        "+-----+-----------------------------+\n"
        "\n"
        " * Подробное описание каждого скрипта *\n"
        "\n"
        " * 1. C (GTK)\n"
        "  ** Описание **: Программа на C использует библиотеку GTK 3.0\n"
        " для создания окна и Cairo для рисования графики.\n"
        " Это настольное приложение, требующее компиляции.\n"
        "  ** Особенности **:\n"
        "  - Использует `cairo_t` для рисования всех элементов (круги, линии, стрелки).\n"
        "  - Обновление времени реализовано через `g_timeout_add`,\n"
        " вызывающий перерисовку каждую секунду.\n"
        "  - Фон (`grnWatch.jpg`) накладывается через `GtkOverlay`.\n"
        "  - Закрытие окна по нажатию клавиши `Q`.\n"
        "  ** Преимущества **: Высокая производительность, нативный вид на десктопе.\n"
        "  ** Недостатки **: Требует установки зависимостей (GTK, Cairo) и компиляции.\n"
        "\n"
        " * 2. Python (Tkinter)\n"
        " ** Описание **: Скрипт на Python использует Tkinter\n"
        " для создания графического интерфейса и холста для рисования.\n"
        " Это кроссплатформенное приложение, запускаемое интерпретатором Python.\n"
        " ** Особенности **:\n"
        "  - Использует `Canvas` для рисования всех элементов.\n"
        "  - Обновление времени через `root.after` каждую секунду.\n"
        "  - Фон (`grnWatch.gif`) добавлен как изображение на холсте.\n"
        "  - Закрытие по сочетанию клавиш `Ctrl+Q`.\n"
        "  ** Преимущества **: Простота запуска, кроссплатформенность,\n"
        " не требует компиляции.\n"
        " ** Недостатки **: Меньшая производительность по сравнению с C,\n"
        " зависимость от Tkinter.\n"
        "\n"
        " 3. JavaScript (HTML5 Canvas)\n"
        " ** Описание **: Веб-приложение, использующее HTML5 Canvas\n"
        " для рисования часов в браузере. Работает без установки дополнительного ПО.\n"
        " ** Особенности **:\n"
        "  - Два слоя Canvas: один для статичных элементов (`signs`),\n"
        " другой для стрелок (`alarm`).\n"
        "  - Обновление времени через `setInterval` каждую секунду.\n"
        "  - Фон (`grnWatch.png`) задан через CSS как `background-image`.\n"
        "  - Добавлены эффекты теней (`shadowColor`, `shadowBlur`).\n"
        " ** Преимущества **: Доступность через браузер, нет необходимости в установке.\n"
        " ** Недостатки **: Зависимость от браузера, меньшая точность позиционирования\n"
        " из-за масштабирования.\n"
        "\n"
        " * Вывод *\n"
        " ** C (GTK) **: Лучший выбор для производительных десктопных приложений\n"
        " с нативным интерфейсом, но требует больше усилий для настройки.\n"
        " ** Python (Tkinter) **: Идеально для быстрого прототипирования\n"
        " и кроссплатформенных решений с минимальными зависимостями.\n"
        " ** JavaScript (HTML5 Canvas) **: Оптимально для веб-приложений,\n"
        " доступных без установки, с хорошей визуальной гибкостью.\n"
        "\n"
        " Каждый скрипт демонстрирует схожий дизайн часов,\n"
        " но адаптирован под свою платформу и язык программирования.\n"
        " Выбор зависит от целевой среды использования.\n"
        " ";
    gtk_text_buffer_set_text(buffer, poem, -1);

    // Добавление CSS для полной прозрачности фона
    GtkCssProvider *provider = gtk_css_provider_new();
    gtk_css_provider_load_from_data(provider,
        "scrolled-window {"
        "   background-color: transparent;"  // Полностью прозрачный фон для прокрутки
        "}"
        "textview, textview text {"
        "   background-color: rgba(224, 225, 225, 0.2);"  // Полупрозрачный фон под текстом
        "   color: black;"  // Цвет текста для читаемости
        "   padding-left: 21px;"
        "   padding-right: 21px;"
        "   padding-top: 21px;"
        "   padding-bottom: 21px;"
        "}",
        -1, NULL);
    gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
        GTK_STYLE_PROVIDER(provider),
        GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    g_object_unref(provider);

    // Сигналы
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

// gcc -o clock clock.c `pkg-config --cflags --libs gtk+-3.0`
